package com.jietuo.class01;

/**
 * @author zhangx & jietuo_zx@163.com
 * @version 1.0
 * @date 2024/3/1
 * @description: 11，一个数组中有两种数出现了奇数次，其他数都出现了偶数次，
 * 怎么找到并打印这两种数
 * 这一题也是可以通过异或来解决
 * 先找最右的1的位置，然后分成两组，分别异或，就得到了出现奇数次的数
 */
public class Code11_EventTimesOddTimes2 {

    public static void main(String[] args) {
        int[] arr = new int[]{2,3,3,4,4,6,6,6,6,9};
        // step1: 异或所有的数字
        int exo = 0;
        for (int i = 0; i < arr.length; i++) {
            exo ^= arr[i];
        }
        // 找出最右边的有1的
        int rightNum = exo & (~exo + 1);
        // 然后使用rightNum 给arr分组
        int exo2 = 0;
        for (int i = 0; i < arr.length; i++) {

            if ((arr[i] & rightNum) != 0){
                exo2 ^= arr[i];
            }
        }
        // 可以找出那两个数字了
        System.out.println("那两个数字分别是：" + exo2 + "和" + (exo ^ exo2));

    }
}
